package cn.dglydrpy.study.common.mybatisPlus.config;/*
 * @author LY_飘涯
 * @date 2021/6/28 21:09
 * @description
 */

import cn.dglydrpy.study.common.mybatisPlus.injector.MySqlInjector;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {

    /**
     * 分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }

    /**
     * SQL执行效率插件  建议只在开发环境使用,因为存在开销
     */
    @Bean
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        // sql语句执行的最大时长:100ms  执行sql时超过该时间会报错!!!
        performanceInterceptor.setMaxTime(100);
        // 格式化sql语句
        performanceInterceptor.setFormat(true);
        return performanceInterceptor;
    }

    /**
     * 乐观锁插件
     * 通过版本号控制并发,避免脏读、幻读、不可重复读等问题
     * 1.获取记录时,带上当前version条件进行获取
     * 2.更新记录时,带上这个version条件进行更新
     * 3.set version = newVersion where version=oldVersion
     * 4.如果version不对,就更新失败
     *
     * 使用注意:
     * 数据库表需增加version字段,对应实体相应增加version字段
     * version支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
     * 整数类型下 newVersion = oldVersion + 1 newVersion 会回写到 entity 中
     * 仅支持 updateById(id) 与 update(entity, wrapper) 方法
     * 在 update(entity, wrapper) 方法下, wrapper 不能复用!!!
     */
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }

    /**
     * 自定义sql注入器
     */
    @Bean
    public MySqlInjector mySqlInjector(){
        return new MySqlInjector();
    }
}
